เริ่มต้นที่กฏการใช้งาน Text File กันก่อน
นามสกุลของไฟล์ Text File ก็คือ ไฟล์ชนิดหนึ่งบน Server ไฟล์ชนิดนี้อาจนามสกุลอะไรก็ได้ ตามแต่เราจะตั้ง แต่โดยทั่วไป เราก็มักจะตั้งนามสกุลของไฟล์ ตามประเภทของมัน เช่น .txt สำหรับข้อความทั่วไป .dat สำหรับไฟล์ ข้อมูล .log สำหรับไฟล์ log หรือ อื่นๆ ตามแต่จะตั้ง
สิ่งที่ควรทำความเข้าใจเกี่ยวกับนามสกุลของไฟล์คือ ไฟล์เหล่านี้สามารถถูกดาวน์โหลดได้โดยบราวเซอร์เพียงแค่รู้ URL ดังนั้นเราไม่ควรใช้ไฟล์เหล่านี้เก็บข้อมูลสำคัญ
แนวทางการป้องกันการดาวน์โหลดไฟล์ สามารถทำได้ครับ โดยการใช้ไฟล์นามสกุล .php โดยที่ตอนต้นของไฟล์ ให้ใส่คำสั่ง <?php exit()?> ก่อนข้อมูลใดๆ ซึ่งเมื่อมีการเรียกไฟล์นี้ผ่าน URL คำสั่งของ PHP ก็จะทำให้ออกจากหน้านี้ไป และไม่สามารถเข้าถึงข้อมูลที่อยู่ต่อจากนั้นได้ และในการอ่านข้อมูลจริง เราก็ต้องข้ามข้อความนี้ไป ครับ
Premission ของไฟล์ ถ้าไฟล์ถูกสร้างบน Server เราไม่จำเป็นต้องกังวลเรื่องนี้มากนัก เนื่องจากไฟล์จะมีเจ้าของเป็น Server การอ่านและเขียนซี่งกระทำบน Server จะไม่มีปัญหาแต่อย่างใด แต่หากเป็นไฟล์ที่อัปโหลดขึ้นไป อาจต้องทำการปรับ chmod เพื่อให้ไฟล์นั้นๆสามารถเขียนหรืออ่านได้
รูปแบบของข้อมูลในไฟล์ ว่ากันตามความเป็นจริงแล้ว ไม่ได้มีกฏอะไรที่ตายตัวสำหรับข้อมูลภายในไฟล์ ยกเว้นมีความต้องการในการใช้ฟังก์ชั่นในการอ่านไฟล์ที่เฉพาะเจาะจง เช่น การใช้ข้อมูลชนิด serialize หรือ การใช้ข้อมูลชนิด csv หรือการใช้ข้อมูลในรูป xml ซึ่งหากต้องการใช้ข้อมูลชนิดเหล่านี้ คุณก็ต้องเขียนไฟล์ให้มันมีรูปแบบตามที่ตัวอ่านข้อมูลจะอ่านออกมาได้
ในทางปฏบัติ คุณอาจเลือกใช้ข้อมูลในรูปแบบที่คุณกำหนดเองก็ได้ โดยการเขียนฟังก์ชั่นให้อ่านและเขียนข้อมูลตามที่ต้องการ ซึ่งมีหลากหลายวิธีตามแต่จะจินตนาการ
ว่าด้วยเรื่องของฟังก์ชั่นในการเขียนไฟล์
ปกติแล้ว การเขียนไฟล์มีฟังก์ชั่นที่ใช้งานกันจริงๆอยู่ไม่กี่ฟังก์ชั่นกันหรอกครับ ลองมาดูตัวอย่างที่นิยมใช้กันดู
ข้อมูลที่ต้องการ
a1|b1|c1
a2|c2|b2
a3|c3|b3ตัวอย่างข้อมูลด้านบน แบ่งออกเป็นข้อมูล 3 คอลัมน์ คั่นแต่ละคอลัมน์ด้วย | และ มีข้อมูลทั้งหมด 3 แถว คั่นแต่ละแถวด้วย \n (ตัวอักษรขึ้นบรรทัดใหม่) การสร้างไฟล์เพื่อให้ได้ข้อมูลดังด้านบนทำได้ไม่ยากครับ
<?php
// ข้อมูลเริ่มต้น (ตัวอย่างจำลอง)
$ds[] = array('a1', 'b1', 'c1');
$ds[] = array('a2', 'b2', 'c2');
$ds[] = array('a3', 'b3', 'c3');
// ดูรูปแบบข้อมูล
//print_r($ds);
// รวมข้อมูลแต่ละแถว
foreach($ds AS $row){
$datas[] = implode('|', $row); // a1|b1|c1
}
// บันทึกเป็นไฟล์
$f = fopen('test.dat', 'w');
fwrite($f, implode("\n", $datas));
fclose($sf);
?>ลองรัน และเปิดไฟล์ test.dat ที่ได้ดูรูปแบบข้อมูลนะครับ (แนะนำให้เปิดด้วย Editpluse เนื่องจาก Editplus รองรับการเปิดไฟล์ที่ใช้ \n เป็นตัวขึ้นบรรทัดใหม่ได้)
การอ่านข้อมูลจากไฟล์ มีได้หลายวิธีครับเช่น
file() อ่านข้อมูลออกมาเป็นแอเรย์ ตามบรรทัด (เข้ากับข้อมูลด้านบนได้ดี)
file_get_content() อ่านข้อมูลออกมาทั้งไฟล์ ที่เหลือ จัดการด้วยตัวเอง
fgetcsv() อ่านข้อมูลในรูปแบบไฟล์ csv ให้ผลลัพท์เป็นแอเรย์ ถ้าใส่พารามิเตอร์ให้กับฟังก์ชั่นให้ถูกต้อง หรือ ใช้ไฟล์ที่มีรูปแบบตรงตามที่กำหนด การใช้ฟังก์ชั่นนี้อันเดียวก็เพียงพอ
fget() อ่านไฟล์ ตรงกันข้ามกับ fwrite() ที่ผมใช้ในตัวอย่างละครับและอื่นๆอีกมากมายครับ
นอกจากการอ่านข้อมูลจากไฟล์แล้ว เราอาจต้องทำการแยกข้อมูลจากไฟล์ออกให้เป็นข้อมูลที่สามารถนำไปใช้งานได้ เช่น อ่านข้อมูลใส่ แอเรย์ ซึ่งฟังก์ชั่นที่ใช้งานได้ก็มีหลายอันครับเช่น
ฟังก์ชั่นเกี่ยวกับ string ทั้งหลายแหล่ เช่น substr() strpos() หรือ อื่นๆ ซึ่งอาจต้องใช้ร่วมกัน และหากไฟล์ข้อมูลเป็น UTF-8 อาจต้องใช้ฟังก์ชั่นที่มี mb_ นำหน้าแทน เช่น mb_substr() หรือ mb_strpos()
ฟังก์ชั่น ในกลุ่ม preg หรือ ereg และหากต้องการใช้กับไฟล์ข้อมูล UTF-8 อาจต้องมีแฟลก u ให้กับ pattern ด้วย
ฟังก์ชั่นในกลุ่ม xml_parse() สำหรับแยกข้อมูล xmlลองดูตัวอย่างง่ายๆในการ อ่่าน และ แยกข้อมูลด้านบน
<?php
// อ่านข้อมูลในไฟล์
$data = file_get_contents('test.date');
// แยกข้อมูลออกเป็นแถว
$datas = explode("\n", $data);
// แยกข้อมูลออกเป็นคอลัมน์
foreach($datas AS $row) {
$ds[] = explode('|', trim($row)); // ใช้ trim() เพื่อป้องกันช่องว่างด้านหน้า และ ด้านหลังข้อมูล เช่น \r
}
// แสดงผลข้อมูลที่อ่านได้
print_r($ds);
?>การอ่านและเขียนข้อมูลด้วย Text File มีข้อควรระวังที่สำคัญก็คือ ตัวอักขระที่ถูกใช้เป็นตัวคั่น เช่น | \r \n จะไม่สามารถใช้งานในข้อมูลได้ (ตามข้อมูลด้านบน) ซึ่งหากมีตัวคั่นในข้อมูลก็จะทำให้การแยกข้อมูลผิดพลาดทันที ในทางปฏิบัติ เราเอาเลือกใช้ตัวคั่นที่พิจารณาแล้วว่ามันจะไม่อยู่ในข้อมูล หรืออาจเลือกใช้การแทนที่ข้อมูลที่มีตัวอักษรที่เป็นตัวคั่นด้วยตัวอักขระอื่นก็ได้